/*
 * @Author: qsy
 * @Date: 2025-04-06 13:19:39
 * @LastEditors: qsy
 * @LastEditTime: 2025-04-10 09:23:41
 * @Description: 主函数
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "my_mqtt.h"
#include "wifi_connect.h"
#include "my_uart.h"
#include "my_adc.h"
#include "dht.h"
#include "my_io.h"

my_value_t my_value_gl;


#define DHT_PIN GPIO_NUM_23  // 根据你的硬件连接修改为实际的GPIO引脚
#define DHT_TYPE DHT_TYPE_DHT11  // 根据你的传感器类型修改

int16_t humidity_dht, temperature_dht;
esp_err_t err;

static const char *TAG = "DHT";

// 每5次记录一次土壤湿度
uint16_t soil_humidity_after_5 = 0;
uint8_t data_count = 0;


// 定义一个全局变量来存储浇水状态
static bool watering_state = false;
// 定时器句柄
static esp_timer_handle_t watering_timer;
/**
 * @description:  定时器回调函数
 * @param {void*} arg
 * @return {*}
 */
static void watering_timer_callback(void* arg)
{
    // 湿度继续小于10 那么就不用关闭
    // if(my_value_gl.soil_humidity < 10){

    // }else{
        // 已经大于10 了 那么就关闭了
        operate_action(MOTOR_GPIO, false);  // 关闭浇水
        printf("stop watering\n");
        watering_state = false;

        // 销毁定时器，避免重复创建
        esp_timer_delete(watering_timer);
    // }
}



void start_watering()
{
    if (!watering_state) {
        operate_action(MOTOR_GPIO, true);  // 开启浇水
        printf("start watering\n");
        watering_state = true;

        // 如果定时器已经存在，先删除再创建
        if (watering_timer != NULL) {
            esp_timer_delete(watering_timer);
        }

        // 创建一个一次性定时器，5秒后触发回调函数
        esp_timer_create_args_t timer_args = {
            .callback = &watering_timer_callback,
            .name = "watering_timer"
        };
        esp_timer_create(&timer_args, &watering_timer);
        esp_timer_start_once(watering_timer, 5000000);  // 5秒
    }
}


/**
 * @description: 与驱动板的串口线程
 * @param {void} *pvParameters
 * @return {*}
 */
void uart_event_task(void *pvParameters)
{
    //串口初始化
    uart_init();
    //串口阻塞循环任务
    uart_task();

}

void app_main(void)
{

    wifi_model_NVS_init(); // 初始化wifi模块、以及NVS存储
    wifi_connect(MAX_AP_COUNT, EXAMPLE_ESP_WIFI_PASS, EXAMPLE_ESP_WIFI_SSID); // 连接wifi

    // 串口1 接收数据线程
    xTaskCreatePinnedToCore(uart_event_task, "uart_event_task", 1024*5, NULL, 1, NULL, 1);


    // 初始化adc配置
    adc1_config_width(ADC_WIDTH);
    adc1_config_channel_atten(ADC1_CHANNEL, ADC_ATTEN);

    // 校准配置
    esp_adc_cal_characteristics_t *adc_chars = calloc(1, sizeof(esp_adc_cal_characteristics_t));
    esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, adc_chars);

    my_io_init(); // 初始化IO口-
    

    while (1)
    {
        int raw_value = adc1_get_raw(ADC1_CHANNEL);
        uint32_t voltage = esp_adc_cal_raw_to_voltage(raw_value, adc_chars);
        // printf("Raw: %d, Voltage: %dmV\n", raw_value, voltage);
        uint32_t humidity = ((3124 - voltage) * 100) / 3124;
        printf("Humidity: %d%%\n", humidity);
        my_value_gl.soil_humidity = humidity;
        vTaskDelay(pdMS_TO_TICKS(200));


        data_count++;
        if(data_count == 5){
            data_count = 0;
            soil_humidity_after_5 = my_value_gl.soil_humidity;
        }

        // 如果当前湿度大于 5次前的湿度10度 那么认为有人加水  发送手动浇水事件
        if(my_value_gl.soil_humidity > soil_humidity_after_5 + 10){
            // 并且水泵没启动
            if(gpio_get_level(MOTOR_GPIO) == 0){
                // 发送手动浇水事件
                mqtt_send_manual_event(true);
            }
        }

        // mqtt_send_manual_event(true);


        // 读取通道ADC1_CHANNEL_2
        raw_value = adc1_get_raw(ADC1_CHANNEL_2);
        voltage = esp_adc_cal_raw_to_voltage(raw_value, adc_chars);
        // printf("Raw: %d, Voltage: %dmV\n", raw_value, voltage);
        // 转换成光照强度 0-100% 对应 3124-0V
        uint32_t light = ((3124 - voltage) * 100) / 3124;
        // printf("Light: %d%%\n", light);
        my_value_gl.light_intensity = light;
        vTaskDelay(pdMS_TO_TICKS(300));

        // 读取整数形式的数据
        err = dht_read_data(DHT_TYPE, DHT_PIN, &humidity_dht, &temperature_dht);
        if (err == ESP_OK)
        {
            // ESP_LOGI(TAG, "Humidity: %d%%, Temperature: %d°C", humidity_dht/10, temperature_dht/10);

            my_value_gl.air_humidity = humidity_dht/10;
            my_value_gl.air_temperature = temperature_dht/10;
            
        }
        else
        {
            ESP_LOGE(TAG, "Error reading DHT data: %s", esp_err_to_name(err));
        }


        mqtt_data_upload(my_value_gl); // 上传数据到云端


        if(my_value_gl.soil_humidity < 10){
            if(gpio_get_level(MOTOR_GPIO) == 0){
                start_watering();  // 开启浇水
            }
            
        }

        if(my_value_gl.light_intensity < 20){
            // 补光
            operate_action(LED_GPIO, true);
        }
        
        if(my_value_gl.light_intensity > 50){
            // 关灯
            operate_action(LED_GPIO, false);
        }

        if(my_value_gl.air_temperature > 30 || my_value_gl.air_humidity < 50){
            // 打开风扇
            operate_action(FENGSAN_GPIO, true);
        }else{
            operate_action(FENGSAN_GPIO, false);
        }


        // 1.小于土壤湿度30%
        // 2.小于温度10摄氏度
        // 3.小于多肉空气湿度80（%）
        if(my_value_gl.soil_humidity < 30||
           my_value_gl.air_humidity < 80||
           my_value_gl.air_temperature < 10){
            // 发送报警事件
            mqtt_send_warning_event(1);
        }

        // mqtt_send_warning_event(1);


    }
}
// {"time": "202501011200"}